package com.skyd.core.android.game.crosswisewar;

import java.util.ArrayList;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;

import com.skyd.core.game.crosswisewar.EntityType;
import com.skyd.core.game.crosswisewar.IEntity;
import com.skyd.core.game.crosswisewar.IIntangible;

public abstract class Entity extends Obj implements IEntity {

	/**
	 * 初始值为0。 功能注释：攻击力
	 */
	private int _ATK = 0;

	/**
	 * 获取ATK。 功能注释：攻击力
	 * 
	 * @return 当前的int类型的值
	 */
	public int getATK() {
		return _ATK;
	}

	/**
	 * 设置ATK。 功能注释：攻击力
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setATK(int value) {
		_ATK = value;
	}

	/**
	 * 设置ATK为其默认值(0)。 功能注释：攻击力
	 */
	public void setATKToDefault() {
		setATK(0);
	}

	/**
	 * 初始值为0。 功能注释：攻击延迟
	 */
	private int _AttackDelay = 0;

	/**
	 * 获取AttackDelay。 功能注释：攻击延迟
	 * 
	 * @return 当前的int类型的值
	 */
	public int getAttackDelay() {
		return _AttackDelay;
	}

	/**
	 * 设置AttackDelay。 功能注释：攻击延迟
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setAttackDelay(int value) {
		_AttackDelay = value;
	}

	/**
	 * 设置AttackDelay为其默认值(0)。 功能注释：攻击延迟
	 */
	public void setAttackDelayToDefault() {
		setAttackDelay(0);
	}

	/**
	 * 初始值为1。 功能注释：攻击范围
	 */
	private int _AttackRange = 1;

	/**
	 * 获取AttackRange。 功能注释：攻击范围
	 * 
	 * @return 当前的int类型的值
	 */
	public int getAttackRange() {
		return _AttackRange;
	}

	/**
	 * 设置AttackRange。 功能注释：攻击范围
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setAttackRange(int value) {
		_AttackRange = value;
	}

	/**
	 * 设置AttackRange为其默认值(1)。 功能注释：攻击范围
	 */
	public void setAttackRangeToDefault() {
		setAttackRange(1);
	}

	/**
	 * 初始值为0。 功能注释：防御力
	 */
	private int _DEF = 0;

	/**
	 * 获取DEF。 功能注释：防御力
	 * 
	 * @return 当前的int类型的值
	 */
	public int getDEF() {
		return _DEF;
	}

	/**
	 * 设置DEF。 功能注释：防御力
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setDEF(int value) {
		_DEF = value;
	}

	/**
	 * 设置DEF为其默认值(0)。 功能注释：防御力
	 */
	public void setDEFToDefault() {
		setDEF(0);
	}

	/**
	 * 初始值为1。 功能注释：生命值
	 */
	private int _HP = 1;

	/**
	 * 获取HP。 功能注释：生命值
	 * 
	 * @return 当前的int类型的值
	 */
	public int getHP() {
		return _HP;
	}

	/**
	 * 设置HP。 功能注释：生命值
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setHP(int value) {
		_HP = value;
		if (value <= 0)
			onDestroyed();
	}

	/**
	 * 设置HP为其默认值(1)。 功能注释：生命值
	 */
	public void setHPToDefault() {
		setHP(1);
	}

	/**
	 * 初始值为1。 功能注释：最大生命值
	 */
	private int _MaxHP = 1;

	/**
	 * 获取MaxHP。 功能注释：最大生命值
	 * 
	 * @return 当前的int类型的值
	 */
	public int getMaxHP() {
		return _MaxHP;
	}

	/**
	 * 设置MaxHP。 功能注释：最大生命值
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setMaxHP(int value) {
		_MaxHP = value;
	}

	/**
	 * 设置MaxHP为其默认值(1)。 功能注释：最大生命值
	 */
	public void setMaxHPToDefault() {
		setMaxHP(1);
	}

	/**
	 * 初始值为0。 功能注释：占用高度
	 */
	private int _OccupyHeight = 0;

	/**
	 * 获取OccupyHeight。 功能注释：占用高度
	 * 
	 * @return 当前的int类型的值
	 */
	public int getOccupyHeight() {
		return _OccupyHeight;
	}

	/**
	 * 设置OccupyHeight。 功能注释：占用高度
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setOccupyHeight(int value) {
		_OccupyHeight = value;
	}

	/**
	 * 设置OccupyHeight为其默认值(0)。 功能注释：占用高度
	 */
	public void setOccupyHeightToDefault() {
		setOccupyHeight(0);
	}

	/**
	 * 初始值为0。 功能注释：占用宽度
	 */
	private int _OccupyWidth = 0;

	/**
	 * 获取OccupyWidth。 功能注释：占用宽度
	 * 
	 * @return 当前的int类型的值
	 */
	public int getOccupyWidth() {
		return _OccupyWidth;
	}

	/**
	 * 设置OccupyWidth。 功能注释：占用宽度
	 * 
	 * @param value
	 *            要设置的int类型值
	 */
	public void setOccupyWidth(int value) {
		_OccupyWidth = value;
	}

	/**
	 * 设置OccupyWidth为其默认值(0)。 功能注释：占用宽度
	 */
	public void setOccupyWidthToDefault() {
		setOccupyWidth(0);
	}

	@Override
	public IEntity[] getEncounterEntity() {
		IEntity s = null;
		float r = Float.MAX_VALUE;
//		for (IObj f : getParentScene().getChildrenList()) {
//			if (f instanceof IEntity) {
//				if(f instanceof IIntangible)continue;
//				IEntity t = (IEntity) f;
//				float tr = Math.abs(f.getPositionInScene().getX()
//						- this.getPositionInScene().getX());
//				if (!t.getNation().equals(this.getNation())
//						&& tr <= this.getAttackRange() && tr < r) {
//					r = tr;
//					s = t;
//				}
//			}
//		}
		for (IEntity f : getParentScene().findEntities(God.getEnemyNation(getNation()), EntityType.WarriorAndBuilding, getNation().getIsRighteous()?getPositionInScene().getX():getPositionInScene().getX()-getBuffed().getAttackRange(), getNation().getIsRighteous()?getPositionInScene().getX()+getBuffed().getAttackRange():getPositionInScene().getX())){
			float tr = Math.abs(f.getPositionInScene().getX()- this.getPositionInScene().getX());
			if(tr < r){
				r = tr;
				s = f;
			}
		}
		
		return s!=null? new IEntity[]{s}:null;
	}

	/**
	 * 初始值为null。 功能注释：直属附加效果
	 */
	private IEntity _Buff = null;

	/**
	 * 获取Buff。 功能注释：直属附加效果
	 * 
	 * @return 当前的IEntity类型的值
	 */
	public IEntity getBuff() {
		return _Buff;
	}

	/**
	 * 设置Buff。 功能注释：直属附加效果
	 * 
	 * @param value
	 *            要设置的IEntity类型值
	 */
	public void setBuff(IEntity value) {
		_Buff = value;
	}

	/**
	 * 设置Buff为其默认值(null)。 功能注释：直属附加效果
	 */
	public void setBuffToDefault() {
		setBuff(null);
	}

	@Override
	public IEntity getBuffed() {
		if (getBuff() == null)
			return this;
		else
			return getBuff().getBuffed();
	}

	@Override
	public IEntity getNative() {
		if (getBuffTarget() == null)
			return this;
		else
			return getBuffTarget().getNative();
	}

	@Override
	public int hurt(IEntity Source) {
		if (this.getBuff() == null) {
			int v = (int) (Source.getATK() * (1 - this.getDEF() * 0.01));
			this.setHP(getHP() - v);
			return v;
		} else
			return this.getBuff().hurt(Source);
	}

	@Override
	public void hurtTo(IEntity[] target) {
//		if(target==null||target.length==0)return;
		if (this.getBuff() == null)
			for(IEntity t:target) t.hurt(this);
		else
			this.getBuff().hurtTo(target);
	}

	@Override
	public void attack(IEntity[] target) {
//		if(target==null||target.length==0)return;
		if (!checkIsInAttackDelay()) {
			hurtTo(target);
			attackDelayCount=getAttackDelay();
		}
	}

	/**
	 * 检验是否处于攻击延迟中
	 * 
	 * @return
	 */
	public boolean checkIsInAttackDelay() {
		return attackDelayCount>0;
	}

	int	attackDelayCount;
	
	@Override
	protected void updateSelf() {
		attackDelayCount--;
		super.updateSelf();
	}

	/**
	 * 初始值为null。 功能注释：附加目标
	 */
	private IEntity _BuffTarget = null;

	/**
	 * 获取BuffTarget。 功能注释：附加目标
	 * 
	 * @return 当前的IEntity类型的值
	 */
	public IEntity getBuffTarget() {
		return _BuffTarget;
	}

	/**
	 * 设置BuffTarget。 功能注释：附加目标
	 * 
	 * @param value
	 *            要设置的IEntity类型值
	 */
	public void setBuffTarget(IEntity value) {
		_BuffTarget = value;
	}

	/**
	 * 设置BuffTarget为其默认值(null)。 功能注释：附加目标
	 */
	public void setBuffTargetToDefault() {
		setBuffTarget(null);
	}

	/**
	 * 被消灭时触发
	 */
	public interface OnDestroyedListener {
		/**
		 * 触发Destroyed事件时执行的方法。事件功能注释：被消灭时触发
		 * 
		 * @param sender
		 *            触发Destroyed事件的对象
		 */
		public abstract void OnDestroyedEvent(Object sender);
	}

	/**
	 * Destroyed事件监听器列表。被消灭时触发
	 */
	private ArrayList<OnDestroyedListener> _DestroyedListenerList = null;

	/**
	 * 增加一个Destroyed事件的监听器，返回是否成功增加。事件功能注释：被消灭时触发
	 * 
	 * @param listener
	 *            Destroyed事件监听器对象
	 * @return 是否成功增加。如果该监听器对象已存在，则返回false。
	 */
	public boolean addOnDestroyedListener(OnDestroyedListener listener) {
		if (_DestroyedListenerList == null)
			_DestroyedListenerList = new ArrayList<OnDestroyedListener>();
		else if (_DestroyedListenerList.contains(listener))
			return false;
		_DestroyedListenerList.add(listener);
		return true;
	}

	/**
	 * 移除一个Destroyed事件的监听器，返回是否成移除。事件功能注释：被消灭时触发
	 * 
	 * @param listener
	 *            Destroyed事件监听器对象
	 * @return 是否成功移除。如果该监听器对象不存在，则返回false。
	 */
	public boolean removeOnDestroyedListener(OnDestroyedListener listener) {
		if (_DestroyedListenerList == null
				|| !_DestroyedListenerList.contains(listener))
			return false;
		_DestroyedListenerList.remove(listener);
		return true;
	}

	/**
	 * 清空所有Destroyed事件的监听器。事件功能注释：被消灭时触发
	 */
	public void clearOnDestroyedListeners() {
		if (_DestroyedListenerList != null)
			_DestroyedListenerList.clear();
	}

	/**
	 * 被消灭时触发
	 */
	protected void onDestroyed() {
		if (_DestroyedListenerList != null)
			for (OnDestroyedListener listener : _DestroyedListenerList) {
				listener.OnDestroyedEvent(this);
			}
	}

	/**
	 * 绘制HP值显示到画板
	 * @param c
	 */
	private void drawHP(Canvas c) {
		float w = getOccupyWidth()*getDisplayAreaFixScaleForSize().getX()*0.5f;
		float h = getOccupyHeight()*getDisplayAreaFixScaleForSize().getY();
		c.translate(0-w/2, 0-h-6);
		Paint p=new Paint();
		p.setColor(Color.BLACK);
		c.drawRect(-1, -1, w+1, 4, p);
		p.setColor(Color.RED);
		c.drawRect(0, 0, w, 3, p);
		p.setColor(Color.GREEN);
		c.drawRect(0, 0, w*(getHP()*1.00f/getMaxHP()), 3, p);
	}

	@Override
	protected void onDrawn(Canvas c, Rect drawArea) {
		super.onDrawn(c, drawArea);
		if(this instanceof IIntangible)return;
		drawHP(c);
	}		
	
	@Override
	public void update() {		
		super.update();
//		if(getBuff()!=null)
//			getBuff().update();
	}
	
//	@Override
//	public void draw(Canvas c, Rect drawArea) {
//		super.draw(c, drawArea);
////		if(getBuff()!=null)
////			((Entity)getBuff()).draw(c, drawArea);
//	}
	
	@Override
	protected void drawChilds(Canvas c, Rect drawArea) {
		super.drawChilds(c, drawArea);
		if(getBuff()!=null)
			((Entity)getBuff()).drawChilds(c, drawArea);
	}
}
